import axios, { type AxiosInstance, type AxiosRequestConfig, type AxiosResponse } from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
import router from '@/router'

const request: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8081',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json; charset=UTF-8',
    Accept: 'application/json; charset=UTF-8'
  }
})

// 请求拦截器 - 自动添加Token
request.interceptors.request.use(
  (config) => {
    const userStore = useUserStore()

    // 如果已登录,在请求头中添加Token
    if (userStore.token) {
      config.headers.Authorization = `Bearer ${userStore.token}`
    }

    return config
  },
  (error) => {
    console.error('请求拦截错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器 - 统一处理响应和错误
request.interceptors.response.use(
  (response: AxiosResponse) => {
    return response.data
  },
  (error) => {
    console.error('请求错误:', error)

    // 处理401未授权错误
    if (error.response && error.response.status === 401) {
      const userStore = useUserStore()

      // 清除登录信息
      userStore.clearAuth()

      // 提示用户
      ElMessage.error('登录已过期,请重新登录')

      // 跳转到首页
      router.push('/')
    } else if (error.response && error.response.status === 403) {
      // 处理403权限不足错误
      ElMessage.error('权限不足,无法访问')
    } else if (error.response && error.response.status >= 500) {
      // 处理服务器错误
      ElMessage.error('服务器错误,请稍后重试')
    } else if (error.message.includes('timeout')) {
      // 处理超时错误
      ElMessage.error('请求超时,请稍后重试')
    } else if (error.message.includes('Network Error')) {
      // 处理网络错误
      ElMessage.error('网络连接失败,请检查网络')
    }

    return Promise.reject(error)
  }
)

export { request }
export default request
